﻿Imports Negocio
Imports Entidad
Imports Utilitario
Public Class frmAsignacionProgramación

    Dim servicio As New RutaNegocio
    Dim servicio1 As New VehiculoNegocio
    Dim servicio2 As New ProgramacionNegocio
    Dim servicio3 As New TurnoNegocio
    Dim servicio4 As New DocumentoClienteNegocio

    'Variables para la asignación
    Dim codVehiculo As String
    Dim acumulador As Decimal = 0
    Dim capVehiculo As Decimal = 0

    Dim vehiculoCod As String = ""
    Dim fechaPro As String = ""
    Dim turnoCod As String = ""

    Sub mensaje(ByVal men As String)
        MsgBox(men, MsgBoxStyle.Information, "Mensajes al Usuario")
    End Sub

    Sub listarAsignaciones()
        Dim ds As DataSet = servicio2.listarAsignaciones(dtpFecha.Text)

        dgvAsignacion.DataSource = ds.Tables(0)

        If dgvAsignacion.RowCount <> 0 Then
            vehiculoCod = dgvAsignacion.Rows(0).Cells("Column20").Value
            fechaPro = dgvAsignacion.Rows(0).Cells("Column29").Value
            turnoCod = dgvAsignacion.Rows(0).Cells("Column30").Value
        End If
    End Sub

    Sub listarTurnos()
        With cboTurnos
            .DataSource = servicio3.listarTurnos.Tables(0)
            .ValueMember = "TUR_Codigo"
            .DisplayMember = "TUR_Descripcion"
        End With
    End Sub

    Sub listarPedidosXRuta(codRuta As String, nomRuta As String)
        chkTodos.Checked = False
        lblSubTitPedidos.Text = "Listado de Pedidos en la Zona : " & nomRuta

        Dim ds As DataSet = servicio.listarPedidosXRuta(codRuta)

        dgvPedidos.DataSource = ds.Tables(0)
    End Sub

    Sub listarVehiculos()
        Dim ds As DataSet = servicio1.listarVehiculos()

        If ds.Tables(0).Rows.Count <> 0 Then
            dgvVehiculos.DataSource = ds.Tables(0)

            If dgvVehiculos.Rows(0).Selected = True Then
                codVehiculo = dgvVehiculos.Item("Column12", 0).Value
                capVehiculo = CDec(dgvVehiculos.Item("Column10", 0).Value)
            End If
        End If
    End Sub

    Sub listarRutas()
        Dim ds As DataSet = servicio.listarRutas()

        If ds.Tables(0).Rows.Count <> 0 Then
            dgvRutas.DataSource = ds.Tables(0)

            If dgvRutas.Rows(0).Selected Then
                listarPedidosXRuta(dgvRutas.Item("Column1", 0).Value, dgvRutas.Item("Column2", 0).Value)
            End If
        End If
    End Sub

    Sub inicializar()
        listarRutas()
        listarVehiculos()
        listarTurnos()
        listarAsignaciones()
    End Sub

    Private Sub frmAsignacionProgramación_Load(sender As System.Object, e As System.EventArgs) Handles MyBase.Load
        inicializar()
    End Sub

    Private Sub dgvRutas_CellClick(sender As Object, e As System.Windows.Forms.DataGridViewCellEventArgs) Handles dgvRutas.CellClick
        Dim f As Integer = e.RowIndex

        If f > -1 Then
            listarPedidosXRuta(dgvRutas.Item("Column1", f).Value, dgvRutas.Item("Column2", f).Value)
        End If
    End Sub

    Private Sub chkTodos_CheckedChanged(sender As System.Object, e As System.EventArgs) Handles chkTodos.CheckedChanged
        If chkTodos.Checked Then
            For Each fila As DataGridViewRow In dgvPedidos.Rows
                If fila.Cells("Column19").Value = "E" Or fila.Cells("Column19").Value = "RE" Or fila.Cells("Column19").Value = "EC" Then
                    fila.Cells("Column13").Value = True
                    dgvPedidos.EndEdit()
                End If
            Next
        Else
            For Each fila As DataGridViewRow In dgvPedidos.Rows
                fila.Cells("Column13").Value = False
                dgvPedidos.EndEdit()
            Next
        End If
    End Sub

    Private Sub dgvPedidos_CellContentClick(sender As Object, e As System.Windows.Forms.DataGridViewCellEventArgs) Handles dgvPedidos.CellContentClick
        dgvPedidos.EndEdit()

        Dim f As Integer = e.RowIndex
        If f > -1 Then
            If dgvPedidos.Rows(f).Cells(0).Selected = True Then
                If dgvPedidos.Rows(f).Cells("Column19").Value = "E" Or dgvPedidos.Rows(f).Cells("Column19").Value = "RE" Or dgvPedidos.Rows(f).Cells("Column19").Value = "EC" Then
                    If dgvPedidos.Rows(f).Cells("Column13").Value = True Then
                        dgvPedidos.Rows(f).Cells("Column13").Value = True
                    Else
                        dgvPedidos.Rows(f).Cells("Column13").Value = False
                    End If
                Else
                    dgvPedidos.Rows(f).Cells("Column13").Value = False
                End If
            End If
        End If
    End Sub

    Private Sub dgvPedidos_CellContentDoubleClick(sender As Object, e As System.Windows.Forms.DataGridViewCellEventArgs) Handles dgvPedidos.CellContentDoubleClick
        dgvPedidos.EndEdit()

        Dim f As Integer = e.RowIndex
        If f > -1 Then
            If dgvPedidos.Rows(f).Cells(0).Selected = True Then
                If dgvPedidos.Rows(f).Cells("Column19").Value = "E" Or dgvPedidos.Rows(f).Cells("Column19").Value = "RE" Then
                    If dgvPedidos.Rows(f).Cells("Column13").Value = True Then
                        dgvPedidos.Rows(f).Cells("Column13").Value = True
                    Else
                        dgvPedidos.Rows(f).Cells("Column13").Value = False
                    End If
                Else
                    dgvPedidos.Rows(f).Cells("Column13").Value = False
                End If
            End If
        End If

    End Sub

    Function validarSeleccionPedidos() As Boolean
        Dim valor As Boolean = False
        Dim contador = 0
        For Each fila As DataGridViewRow In dgvPedidos.Rows
            If fila.Cells("Column13").Value = True Then
                contador = contador + 1
                acumulador = acumulador + CDec(fila.Cells("Column16").Value)
            End If
        Next

        If contador <> 0 Then
            valor = True
        End If

        Return valor
    End Function

    Sub asignar()
        For Each fila As DataGridViewRow In dgvPedidos.Rows
            If fila.Cells("Column13").Value = True Then
                Dim orden As Integer = servicio2.obtenerNumeroOrden()
                Dim program As New Programacion(fila.Cells("Column14").Value, codVehiculo, cboTurnos.SelectedValue.ToString, CDate(dtpFecha.Text), orden)
                servicio2.registrarProgramacion(program)
                servicio4.actualizarFlagProgramado(fila.Cells("Column14").Value, "P", "1")
            End If
        Next
        mensaje("La programación se realizó exitosamente.")
        acumulador = 0
        codVehiculo = ""
        cboTurnos.SelectedIndex = 0
        listarRutas()
        listarAsignaciones()
        listarVehiculos()
    End Sub

    Private Sub btnAsignar_Click(sender As System.Object, e As System.EventArgs) Handles btnAsignar.Click
        If CDate(dtpFecha.Text) >= CDate(Date.Now.ToString("dd/MM/yyyy")) Then
            If validarSeleccionPedidos() = True Then
                If codVehiculo <> "" Then
                    If capVehiculo >= acumulador Then
                        If MsgBox("¿Está seguro que desea realizar la asignación?", MsgBoxStyle.Question + MsgBoxStyle.YesNo + MsgBoxStyle.DefaultButton2, "Mensajes al Usuario") = MsgBoxResult.Yes Then
                            asignar()
                        Else
                            acumulador = 0
                        End If
                    Else
                        If MsgBox("Los pedidos por asignar sobrepasan la capacidad del vehículo ¿Está seguro que desea realizar esta asignación?", MsgBoxStyle.Question + MsgBoxStyle.YesNo + MsgBoxStyle.DefaultButton2, "Mensajes al Usuario") = MsgBoxResult.Yes Then
                            asignar()
                        Else
                            acumulador = 0
                        End If
                    End If
                Else
                    mensaje("No se ha seleccionado ningún vehículo.")
                    acumulador = 0
                End If
            Else
                mensaje("Debe seleccionar al menos un pedido.")
                acumulador = 0
            End If
        Else
            mensaje("La fecha de programación debe ser mayor o igual a la de hoy.")
            dtpFecha.Text = Date.Now.ToString("dd/MM/yyyy")
        End If
    End Sub

    Private Sub dgvVehiculos_CellClick(sender As Object, e As System.Windows.Forms.DataGridViewCellEventArgs) Handles dgvVehiculos.CellClick
        Dim f As Integer = e.RowIndex

        If f > -1 Then
            codVehiculo = dgvVehiculos.Rows(f).Cells("Column12").Value
            capVehiculo = CDec(dgvVehiculos.Item("Column10", f).Value)
        End If
    End Sub

    Private Sub dtpFecha_TextChanged(sender As Object, e As System.EventArgs) Handles dtpFecha.TextChanged
        listarAsignaciones()
    End Sub

    Private Function verificarPedidosPorRepartir(ds As DataSet) As Boolean
        Dim valor As Boolean = False
        Dim contador As Integer = 0
        For i = 0 To ds.Tables(0).Rows.Count - 1
            If ds.Tables(0).Rows(i)("DCI_Estado").ToString.Trim = EST_PorRepartir Then
                contador = contador + 1
            End If
        Next
        If contador <> 0 Then
            valor = True
        End If
        Return valor
    End Function

    Private Sub btnEliminar_Click(sender As System.Object, e As System.EventArgs) Handles btnEliminar.Click
        If vehiculoCod <> "" Then
            If MsgBox("¿Está seguro que desea eliminar la asignación", MsgBoxStyle.Question + MsgBoxStyle.YesNo + MsgBoxStyle.DefaultButton2, "Mensajes al Usuario") = MsgBoxResult.Yes Then
                Dim ds As DataSet = servicio2.obtenerPedidosProgramados(vehiculoCod, fechaPro, turnoCod)

                If verificarPedidosPorRepartir(ds) = True Then
                    mensaje("No se puede eliminar, algunos pedidos ya están cargados al vehículo.")
                Else
                    For i = 0 To ds.Tables(0).Rows.Count - 1
                        servicio4.actualizarFlagProgramado(ds.Tables(0).Rows(i)("DCI_Codigo").ToString.Trim, "P", "0")
                    Next
                    servicio2.eliminarProgramacion(vehiculoCod, fechaPro, turnoCod, "")
                    mensaje("La programación se eliminó correctamente.")
                    listarAsignaciones()
                    listarRutas()
                End If
            End If
        Else
            mensaje("No ha escogido ningún registro.")
        End If
    End Sub

    Private Sub dgvAsignacion_CellClick(sender As Object, e As System.Windows.Forms.DataGridViewCellEventArgs) Handles dgvAsignacion.CellClick
        Dim f As Integer = e.RowIndex

        If f > -1 Then
            vehiculoCod = dgvAsignacion.Rows(f).Cells("Column20").Value
            fechaPro = dgvAsignacion.Rows(f).Cells("Column29").Value
            turnoCod = dgvAsignacion.Rows(f).Cells("Column30").Value
        End If
    End Sub

    Private Sub dgvAsignacion_CellDoubleClick(sender As Object, e As System.Windows.Forms.DataGridViewCellEventArgs) Handles dgvAsignacion.CellDoubleClick
        Dim f As Integer = e.RowIndex

        If f > -1 Then
            frmActualizarProgramacion.lblCodVehiculo.Text = dgvAsignacion.Rows(f).Cells("Column20").Value
            frmActualizarProgramacion.lblCodTurno.Text = dgvAsignacion.Rows(f).Cells("Column30").Value
            frmActualizarProgramacion.lblPlaca.Text = dgvAsignacion.Rows(f).Cells("Column27").Value
            frmActualizarProgramacion.lblFecha.Text = dgvAsignacion.Rows(f).Cells("Column29").Value
            frmActualizarProgramacion.lblTurno.Text = dgvAsignacion.Rows(f).Cells("Column28").Value

            If frmActualizarProgramacion.ShowDialog() = Windows.Forms.DialogResult.OK Then
                mensaje("Actualización completada.")
                listarRutas()
                dtpFecha.Text = Date.Now.ToString("dd/MM/yyyy")
                listarAsignaciones()
            End If
        End If
    End Sub

    Private Sub dgvAsignacion_CellFormatting(sender As Object, e As System.Windows.Forms.DataGridViewCellFormattingEventArgs) Handles dgvAsignacion.CellFormatting
        For i = 0 To dgvAsignacion.Rows.Count - 1
            If dgvAsignacion.Item("Column31", i).Value = "1" And e.RowIndex = i Then
                e.CellStyle.ForeColor = Color.Red
            End If
        Next
    End Sub

End Class